home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 076-100 / disk_077 / language.doc / drcerr.ref < prev    next >
Text File  |  1992-05-06  |  51KB  |  1,159 lines

  1. XVI. Error messages
  2.  
  3.     The Draco compiler has nearly 150 English-language error message. The
  4.     compiler flags all errors which it detects. It goes to quite a lot of
  5.     trouble to avoid multiple messages caused by a single error, but it
  6.     is by no means perfect. Any persistently bad cases should be reported.
  7.     Because of the type-tight nature of the Draco language, it is possible
  8.     for some programs to yield a large number of error messages. The best
  9.     approach to handling this situation is incrementally - take care of the
  10.     messages that stand out as the first of a group, then compile again.
  11.     This might take longer, but is usually less frustrating. It is not
  12.     unusual for a single compilation to produce dozens of messages, which
  13.     can be rather disconcerting. In most cases, many of the messages will
  14.     have similar causes, and understanding one message will give
  15.     understanding of many messages caused by repetitions of the same error.
  16.     The most persistent message will probably be that which insists that
  17.     some value is not type compatible with some other. This can be caused
  18.     by several situations, but in general means just what it says - the
  19.     programmer has tried to use a value which is not appropriate for the
  20.     position it was used in, whether it is an assignment statement, a
  21.     parameter to a procedure, an operand to an operator, the result of an
  22.     if expression, an array index, etc.
  23.  
  24.     Some errors are purely syntactic in nature, and have no effect on the
  25.     compilation of the program, other than to require that an error message
  26.     be printed out. The Draco compiler gives a warning instead of an error
  27.     in these situations, and then proceeds as if the error had not ocurred.
  28.     If a compilation has only warnings, and no true errors, then it will
  29.     succeed, and the .r file will not be deleted.
  30.  
  31.     The approach to error messages taken by the compiler may seem like
  32.     overkill to some. For example, all occurrences of an undefined symbol
  33.     are flagged (successive occurrences are, however, flagged as such). These
  34.     messages could easily have been left out, but it was felt that all errors
  35.     detected by the compiler should be reported. For this particular error,
  36.     it may have resulted from spelling a given name two different ways. If
  37.     that is the case, it is handy to know where all of the mispellings are,
  38.     so that they can be corrected. Some people would also argue that the
  39.     compiler should simply ignore simple syntactic errors. If the compiler
  40.     were smart enough to actually modify the source file so as to remove
  41.     the errors permanently, this might be desireable. Since this is not the
  42.     case, the errors are flagged (perhaps as warnings), so that the
  43.     programmer will fix them. No programmer with any sense of pride would
  44.     want to distribute a program containing known errors, even trivial
  45.     syntax errors. The other problem with this situation is that the compiler
  46.     might not be right in it's assumptions - the error may be a true error,
  47.     which must be fixed in some other way than the obvious (e.g. inserting
  48.     a semicolon). The compiler would be doing a great disservice if it
  49.     failed to flag such an error, and since it cannot always be SURE, it must
  50.     flag all errors it notices.
  51.  
  52.     The error messages produced by the Amiga version of the Draco compiler,
  53.     along with their usual causes and cures, are as follows:
  54.  
  55.     (The text for the following errors is stored in file drlib:drcerr.dat.
  56.     If this file is not present, the compiler will simply print the error
  57.     numbers without the corresponding text.)
  58.  
  59.     (All of the following 15 errors are fatal, in that the compiler cannot
  60.     readily recover from them. The compilation terminates immediately.)
  61.  
  62.     0 - cannot open source file
  63.  
  64.     The specified .d or include file cannot be opened. Normally, this
  65.     means that the file doesn't exist, and is typically caused by
  66.     mistyping the 'draco ...' command. Try again.
  67.  
  68.     1 - cannot create .r file
  69.  
  70.     The compiler was unable to create a .r file corresponding to the
  71.     current .d file. This will normally indicate that either the disk
  72.     is full, or the directory is full. Delete some unneeded files and
  73.     try again.
  74.  
  75.     2 - cannot close .r file
  76.  
  77.     This should not happen. It indicates a system error. This may occur
  78.     if the disk and/or directory are full. Try again; if the error
  79.     persists, remove some unneeded files.
  80.  
  81.     3 - error on write to .r file
  82.  
  83.     This indicates a system error (disk error), or that the disk and/or
  84.     directory are full. Delete some unneeded files and try again.
  85.  
  86.     4 - unexpected end-of-file on source input
  87.  
  88.     This occurs when the compiler's parser expects more input, but the
  89.     end of the input source file has been reached. This indicates that
  90.     the source file has somehow been truncated (check it by TYPEing it
  91.     out), or that the parser has been confused. If the compilation has
  92.     already produced a number of syntax-related errors, this message can
  93.     probably be ignored.
  94.  
  95.     5 - program buffer overflow (procedure too long)
  96.  
  97.     The compiler has a single large buffer which contains both the text
  98.     of all identifiers, and the machine code being produced. This message
  99.     indicates that that buffer has overflowed. If the procedure where the
  100.     message occurred is large, split it up into 2 or more pieces,
  101.     otherwise you must shorten the identifiers you have used.
  102.  
  103.     6 - constant buffer overflow (too much constant)
  104.  
  105.     Constants used in declarations are contained in a single large
  106.     buffer. That buffer has overflowed. You must reduce the amount of
  107.     constant present at the location at which the error occurred. Since
  108.     all local constants are removed at the end of each procedure, this
  109.     problem is usually fixed by splitting up the current procedure,
  110.     balancing the constant(s) among the pieces. Note that this limit
  111.     only refers to string, array and structure constants; simple scalar
  112.     constants are stored directly in the symbol table.
  113.  
  114.     7 - constant table overflow (too many constants)
  115.  
  116.     Each individual constant requires an entry in a table. That table
  117.     has overflowed. Reduce the number of different constants present,
  118.     usually by splitting up the current procedure.
  119.  
  120.     8 - case table overflow (too many alternatives)
  121.  
  122.     Each alternative in a case statement or expression is recorded in a
  123.     table. This allows the compiler to generate the appropriate indexing
  124.     code based on knowledge of all alternatives. When case statements are
  125.     nested, the number of alternatives present is the sum of those in the
  126.     innermost case, plus all of those up to the present point in all
  127.     outer cases. The total number of alternatives present must be
  128.     reduced, ususally by moving some inner cases to separate procedures.
  129.  
  130.     9 - descriptor table overflow (nesting too deep)
  131.  
  132.     Each level of expression nesting requires a descriptor to describe
  133.     the left-hand operand of an operator whose right-hand operand is
  134.     currently being parsed. If this error occurs, simplify the expression
  135.     in which it occurs.
  136.  
  137.     10 - relocation table overflow (too many constant indexes)
  138.  
  139.     In order that the program written to the .r file be relocatable
  140.     by the link editor, the compiler must include, as part of the .r
  141.     file, information which indicates all uses of different variable
  142.     addresses used in each procedure. This information is dumped out at
  143.     the end of the machine code for each procedure. To do that, the
  144.     information must be held in a table until that time. That table
  145.     (actually one of several) has overflowed. The simplest fix for this
  146.     is to split up the current procedure. Because of optimizations done
  147.     by the compiler, references to different addresses can occur in ways
  148.     that may not be expected. For example, indexing an array by an
  149.     expression whose value the compiler can determine, will use a direct
  150.     reference to the selected element, rather than a reference to the
  151.     beginning of the array plus run-time code to index it. Similarly,
  152.     field selection is usually a strictly compile-time operation. These
  153.     hidden relocation table entries can cause a table overflow, even if
  154.     there is only one variable being referenced in the procedure.
  155.  
  156.     11 - symbol table overflow (too many indentifiers)
  157.  
  158.     At this point in the program, there are too many identifiers present.
  159.     This includes all indentifiers from include files, file declarations,
  160.     and local declarations. All procedure names, field names, enumeration
  161.     type value names, constant names, variable names, type names, etc.
  162.     are included. This error indicates that you are truly straining the
  163.     limits of your version of the compiler. You can attempt to avoid the
  164.     problem in a limited way by splitting up procedures and/or source
  165.     files, but the only proper fix is to reduce the number of identifiers
  166.     in your program.
  167.  
  168.     12 - type table overflow (too many types)
  169.  
  170.     Your program has too many types for your version of the compiler.
  171.     Types are generated explictly by type declarations and implicitly by
  172.     procedure declarations (the type of the procedure indicates the
  173.     number and type of its parameters, and the type of its result), and
  174.     by variable declarations of other than simple variables.
  175.  
  176.     13 - type information table overflow (types too complex)
  177.  
  178.     There is no inherent limit to the complexity of types, but the
  179.     descriptions of the types must be maintained. Information is needed
  180.     for array, procedure and structure/union types. The table holding
  181.     this information has overflowed. A good cure is to split up the
  182.     current source file. If that doesn't work, you will have to find
  183.     ways to use less complex or fewer complex types.
  184.  
  185.     14 - compiler error - bad case in 'typSize' or 'checkDuplicate'
  186.  
  187.     This should not happen. If it does, please send me an exact copy
  188.     of the program and include files which caused it.
  189.  
  190.     (The remaining errors are not fatal - the compiler will continue.)
  191.  
  192.     (The following 4 error messages will be accompanied by an identifier
  193.     from the program. This identifier is the one the message refers to. In
  194.     the descriptions below, the identifier is represented by XXX.)
  195.  
  196.     15 - "XXX" is already defined
  197.  
  198.     The symbol in question already has an existing declaration. You
  199.     cannot give it another meaning. This can also occur at the end of the
  200.     header for a procedure being defined, if the definition does not
  201.     match a previous forward declaration using 'extern'.
  202.  
  203.     16 - "XXX" is not defined
  204.  
  205.     The symbol in question has no current declaration. This indicates a
  206.     spelling error (either in the current use or in the declaration), a
  207.     missing include file, or simply a forgotten declaration.
  208.  
  209.     17 - "XXX" is not defined (subsequent use)
  210.  
  211.     This is the same error as #16, but subsequent uses are distinguished,
  212.     since in most cases these messages will disappear when the cause of
  213.     the corresponding #16 message is fixed.
  214.  
  215.     18 - Type "XXX" has been used but not defined
  216.  
  217.     As previously mentioned in the section on types, the subtype for the
  218.     '*' pointer-type constructer can be an undeclared identifier, which
  219.     is taken to be a type name which will be declared later. If this
  220.     message occurs, then symbol XXX has been used in that way, but there
  221.     was no later declaration of it as a type. The cause could be a
  222.     spelling error, or simply forgetting to supply the declaration.
  223.  
  224.     19 - error # 19
  225.  
  226.     This error currently has no meaning
  227.  
  228.     20 - expecting global declaration in include file
  229.  
  230.     When processing the declarations in an include file (.G file), the
  231.     compiler encountered something which it didn't recognize as a
  232.     declaration. The usual cause will be a syntax error (typo) in the
  233.     declarations in the include file. Some of the declarations may not be
  234.     processed as a result, and references to those identifiers in the
  235.     program will yield 'not defined' messages. In cases such as this, it
  236.     is usually best to fix the problem in the declarations, then try
  237.     again, since many later error messages will go away.
  238.  
  239.     21 - expecting procedure header or file global declaration
  240.  
  241.     When processing a source file, and a procedure definition has not yet
  242.     been processed, the compiler encountered something which it didn't
  243.     recognize as either a declaration or a procedure header. The usual
  244.     cause is a syntax error (typo) in the declarations or in the first
  245.     procedure header. As with error #20, it may be best to fix the error
  246.     and try again, ignoring any subsequent messages in this compilation.
  247.  
  248.     22 - expecting procedure header for new procedure
  249.  
  250.     This is similar to error #21, except that at least one procedure
  251.     definition has been encountered, therefore more declarations are not
  252.     valid. This message usually results from syntax errors in the body of
  253.     the previous (or current) procedure, which have confused the parser.
  254.  
  255.     23 - value must be 0 - 255
  256.  
  257.     Several situations, e.g. an escaped character value and the port
  258.     number for the 8080 specific input/output constructs, require a
  259.     constante expression whose value is between 0 and 255. The constant
  260.     expression given was outside of that range.
  261.  
  262.     24 - 'signed' range must be <= 2**32 - 1
  263.  
  264.     The value of a compile-time expression used in the 'signed' type
  265.     constructer must be between 0 and 32767 for this version of the
  266.     compiler. Other versions will support at least this much range.
  267.  
  268.     25 - missing ')' in escaped character
  269.  
  270.     The compiler was expecting the closing ')' in an escaped character,
  271.     but did not find it. This can occur if the ')' is indeed missing, or
  272.     if syntax errors in the expression have caused the parser to
  273.     prematurely terminate the expression.
  274.  
  275.     26 - bad digit in numeric constant
  276.  
  277.     The valid digits in numeric constants depend on the base being used.
  278.     Binary numbers allow only '0' and '1', octal allows '0' - '7',
  279.     decimal allows '0' - '9', and hexadecimal allows '0' - '9', 'a' - 'f'
  280.     and 'A' - 'F'.
  281.  
  282.     27 - overflow in numeric constant
  283.  
  284.     The maximum value for a numeric constant depends on the particular
  285.     version of the compiler. The 68000 version for 8080's supports only
  286.     32 bit values, hence the maximum value allowed is
  287.     0b11111111111111111111111111111111, 0o37777777777, 4294967295,
  288.     0xffffffff.
  289.  
  290.     28 - missing closing "'" in character constant
  291.  
  292.     The closing apostrophe in a single character constant was not found
  293.     when expected. This can because it was actually forgotten, or because
  294.     syntax errors in an escaped character have confused the parser.
  295.  
  296.     29 - missing closing '"' in string constant
  297.  
  298.     The closing quote of a chars constant is missing. As with error #28,
  299.     this can be an actual missing quote, or a syntax error in an escaped
  300.     character. In this case, the remainder of the input line will have
  301.     been swallowed as part of the constant.
  302.  
  303.     30 - illegal character
  304.  
  305.     A character was encountered, outside of quote marks and not as part
  306.     of a comment, which is not part of any valid Draco symbol. If the
  307.     character is not visible when you examine the source file, it may be
  308.     a control character, or a character with the high bit set. In such
  309.     cases, completely retype the line on which the error occurred.
  310.  
  311.     31 - cannot use 'sizeof' on arrays with '*' dimensions
  312.  
  313.     The total size of an array parameter which is declared using one or
  314.     more dimensions as '*', is not known until run-time. Since 'sizeof'
  315.     is a strictly compile-time operation, it cannot be applied to such
  316.     arrays.
  317.  
  318.     32 - expecting identifier in declaration
  319.  
  320.     When parsing a declaration (of any kind - type, variable, constant,
  321.     field, enumeration type value, etc.) an identifier was not
  322.     encountered when one was expected. This normally means that you have
  323.     accidentally tried to use one of Draco's reserved words (including
  324.     the machine-specific ones) as a variable name. This message can also
  325.     occur if the parser gets confused by syntax errors in a set of
  326.     declarations.
  327.  
  328.     33 - expecting ',' as separator in list
  329.  
  330.     The compiler uses the same code to check for separating commas in
  331.     lists of several types (e.g. declarations, procedure parameteters).
  332.     The expected comma was not found. Again, this can be caused by an
  333.     actual missing or mistyped comma, or by a previous syntax error in
  334.     the declaration, call, etc.
  335.  
  336.     34 - expecting '{'
  337.  
  338.     The left brace bracket which is part of a structure, union or
  339.     enumeration type was not found. Normally, you will have just
  340.     forgetten to put it in, but this can also mean a preceeding syntax
  341.     error, or just that you are trying to do something that the language
  342.     doesn't allow.
  343.  
  344.     35 - missing ']'
  345.  
  346.     The closing square bracket in an array declaration or the indexing
  347.     of an array was not found when expected. As usual, this indicates
  348.     either a forgotten or mistyped ']', or preceeding syntax errors
  349.     which have confused the parser.
  350.  
  351.     36 - identifier is not a defined type
  352.  
  353.     In a situation where a type is expected, an identifier has occurred
  354.     which is not a type which has already been declared. Note that the
  355.     use of undefined types (identifiers which will later be declared as
  356.     types) is ONLY allowed following the '*' type constructor. Again,
  357.     this message can occur if the parser is confused by previous syntax
  358.     errors.
  359.  
  360.     37 - numeric constant required
  361.  
  362.     Several placed in the language require a numeric constant (or a
  363.     compile-time expression yielding a numeric value). In one of these
  364.     places, the expression found either could not be evaluated at
  365.     compile time, or it yielded a non-numeric type. Some of these places
  366.     are: 'signed'/'unsigned' types, array bounds, simple constants
  367.     inside array or structure constants and case indices.
  368.  
  369.     38 - positive value required
  370.  
  371.     This is related to error number 37. Many of those same places require
  372.     that the constant be positive. The value was negative or 0.
  373.  
  374.     39 - missing '}' in enumeration type
  375.  
  376.     The closing brace bracket for an enumeration type was not found when
  377.     it was expected. As usual, this can be caused by an actual missing or
  378.     mistyped '}', or by a preceeding syntax error.
  379.  
  380.     40 - only parameter arrays can have '*' dimensions
  381.  
  382.     The '*' form of array dimension can only be used at the top level of
  383.     arrays which are the formal parameters of a procedure. All other
  384.     array dimensions must be constant expressions.
  385.  
  386.     41 - error # 41
  387.  
  388.     This error number is not currently uses.
  389.  
  390.     42 - syntax error - expecting type
  391.  
  392.     The parser is in a situation where a type is expected, but the
  393.     current input is not a symbol which can be the start of a type. This,
  394.     as usual can result from a typo in the current symbol, or from a
  395.     preceeding syntax error.
  396.  
  397.     43 - missing '=' in type definition
  398.  
  399.     The form when declaring new types is the name of the new type,
  400.     followed by an equals sign, followed by the definition of the type.
  401.     In such a declaration, the '=' was missing.
  402.  
  403.     44 - constant value must be string or compile-time expression
  404.  
  405.     When declaring named constants, the value given to the constant must
  406.     be either a string ('chars' or single character), or a numeric value
  407.     which is the result of a compile-time expression. The current value
  408.     isn't one of those. This can result from the use of a variable
  409.     instead of a constant in the expression, a syntax error in the
  410.     expression, the use of an undeclared symbol in the expression, or the
  411.     use of a construct which cannot be evaluated at compile-time.
  412.  
  413.     45 - parameters to 'code' must be constants or variables
  414.  
  415.     The machine specific 'code' construct, which allows the insertion of
  416.     native machine code into the emitted code stream, must be given
  417.     simple constant expressions specifying the bytes to be emitted, or
  418.     the names (possibly indexed) of local or global variables. The
  419.     expression in question was not one of those alternatives.
  420.  
  421.     46 - missing 'corp' at end of procedure
  422.  
  423.     The parser has decided that the current procedure has ended, since
  424.     the current symbol cannot start a statement, but the symbol found was
  425.     not the expected 'corp'. This can be an actual forgotten 'corp', but
  426.     is more likely to result from previous syntax errors.
  427.  
  428.     47 - 'vector' procedures cannot return a result
  429.  
  430.     Procedures declared as interrupt vectors using the 'vector' word,
  431.     cannot return a result, they must yield 'void'.
  432.  
  433.     48 - missing ':' after procedure header
  434.  
  435.     When defining a procedure, there must be a colon after the returned
  436.     type. This message most often results from putting a semicolon there
  437.     instead of a colon. It could also occur as a result of syntax errors
  438.     in the procedure header.
  439.  
  440.     49 - 'vector' procedures cannot have parameters
  441.  
  442.     Procedures declared as interrupt vectors using the 'vector' word,
  443.     cannot have any parameters.
  444.  
  445.     50 - result expression given for 'void' procedure
  446.  
  447.     A procedure declared as yielding 'void' cannot have a result
  448.     expression (the expression at the end of the body of a procedure
  449.     which is to yield a result).
  450.  
  451.     51 - no result given for procedure when one was declared
  452.  
  453.     A procedure declared as yielding a result (type other than 'void'),
  454.     did not have a result expression at the end of it's body.
  455.  
  456.     52 - statement cannot be used as 'bool' condition
  457.  
  458.     The value used for a condition (the part after the 'if' or the part
  459.     after the 'while') was a statement, or a call of a procedure which
  460.     yields 'void'. Unlikely to occur.
  461.  
  462.     53 - only 'bool' values can be used as conditions
  463.  
  464.     The value used for a condition (the part after the 'if' or the part
  465.     after the 'while') must be an expression of type 'bool'. This will
  466.     usually mean that an ex- C programmer has forgotten to compare a
  467.     value with 0.
  468.  
  469.     54 - statement cannot be used as expression
  470.  
  471.     Somewhere in an expression, a statement, or a call of a procedure
  472.     which yields 'void' has been used. This will normally result when
  473.     a large program is restructured, and this particular use of a
  474.     procedure was missed. This message could also occur as a result of
  475.     preceeding syntax errors.
  476.  
  477.     55 - constant is out of range for the destination type
  478.  
  479.     When assigning values (either in a constant declaration, an actual
  480.     assignment statement, or when passing a parameter), the value being
  481.     used is too large for the type it is being used with. E.g. if X is
  482.     declared as 'signed 10', this message will result from trying to use
  483.     a value less than -10 or greater than +10 with X. This checking does
  484.     not apply in expressions, where all numeric types are compatible.
  485.     This error can also occur in a 2nd or succeeding branch of an if-
  486.     expression or case-expression. The type of the result of these
  487.     constructs is taken from the type of the first alternative. If this
  488.     is a numeric type, then succeeding alternatives must be compatible
  489.     with it.
  490.  
  491.     56 - statements cannot be used as expressions in assignments
  492.  
  493.     When assigning a value (either in a constant declaration, an actual
  494.     assignment statement, or when passing a parameter), the value being
  495.     assigned is actually a statement, not an expression. This can happen
  496.     if a procedure which used to return a value has been changed to not
  497.     return a value, and this use of it was not fixed up. It can also
  498.     happen as a result of preceeding syntax errors.
  499.  
  500.     57 - value is not type compatible with destination
  501.  
  502.     This is the most common error message in Draco programs. You will
  503.     quickly learn to hate this message. It can occur in a large number
  504.     of circumstances (the compiler uses common code to check for type
  505.     compatibility). Basically, the value flagged has a type which is not
  506.     compatible with what is currently expected. Unfortunately, the same
  507.     location in the program can have several expected types, resulting
  508.     from the type of a destination in an assignment statement, the
  509.     expected type of a right hand operand which the current symbol is a
  510.     rightmost part of (there can be several such situations for a given
  511.     symbol) or the expected type of a parameter to a procedure. You will
  512.     have to examine the expected types of the various situations in
  513.     which the current symbol is participating (often by checking the
  514.     declarations of various identifiers), and follow through the rules
  515.     for the needed types for the various operators nearby. Fortunately,
  516.     most situations will be fairly straightforward - passing the wrong
  517.     type of value to a procedure, assigning a character to an integer,
  518.     etc. See the note on error #55 for another tricky case.
  519.  
  520.     58 - mixed statements/expressions as 'if' or 'case' alternatives
  521.  
  522.     The current branch of an 'if' or 'case' is an expression, when the
  523.     first branch was a statement, or the current branch is a statement
  524.     when the first branch was an expression. This message will often
  525.     result from putting a semicolon after the expression, since the
  526.     semicolon is used to 'throw the previous thing away, turn it into a
  527.     statement'. It can also result from changing a convention in your
  528.     program, but forgetting to change a use of that convention in the
  529.     current 'if' or 'case'.
  530.  
  531.     59 - alternatives in 'if' or 'case' are not type compatible
  532.  
  533.     The resulting type of an 'if' or 'case' expression is determined from
  534.     the first alternative which is not an undefined symbol. The types of
  535.     later alternatives must be compatible with this chosen type. All
  536.     numeric types are compatible, but various enumeration types, pointer
  537.     types, procedure types, structure types, etc. are not compatible with
  538.     anything except themselves (if both types are named) or an equivalent
  539.     type (if one or more are unnamed types). Again, note that the
  540.     compiler will object to a constant which will not fit in the
  541.     determined numeric type.
  542.  
  543.     60 - missing 'then' in 'if'
  544.  
  545.     After the condition in an 'if' or 'elif', there must be a 'then'. If
  546.     this message occurs, there has probably been a syntax error in the
  547.     condition (unless you actually omitted or misspelled the 'then').
  548.  
  549.     61 - missing 'else' or 'fi' in 'if'
  550.  
  551.     After a body in an 'if', there must be either the closing 'fi', the
  552.     'else' part or an 'elif' part. The current symbol is none of these
  553.     words. This will normally be caused by misspelling the word, or by a
  554.     preceeding syntax error which has got the compiler confused. This
  555.     type of error (missing keyword) will often occur when 'while's and
  556.     'if's are nested, and the closing keyword of the nested compound was
  557.     forgotten or misspelled.
  558.  
  559.     62 - 'if' expressions must have an 'else' part
  560.  
  561.     When the first alternative of an 'if' is an expression, the 'if' is
  562.     assumed to be an if expression. As such, it must have an 'else' part
  563.     (an expression must always yield a value). Syntax errors can also
  564.     cause this message to appear spuriously.
  565.  
  566.     63 - missing 'fi' in 'if'
  567.  
  568.     The closing 'fi' in an if statement or if expression is missing or
  569.     was misspelled. Again, this can occur spuriously as a result of
  570.     earlier syntax errors.
  571.  
  572.     64 - missing 'do' in 'while' or 'for'
  573.  
  574.     The 'do' in a while statement or a for statement did not appear when
  575.     it was expected. Either it was forgotten or misspelled, or a previous
  576.     syntax error has confused the parser.
  577.  
  578.     65 - missing 'od' in 'while' or 'for'
  579.  
  580.     The closing 'od' in a while statement or for statement did not appear
  581.     when it was expected. Either it was forgotten or misspelled, or a
  582.     preceeding syntax error has confused the parser.
  583.  
  584.     66 - body of 'while' must not be an expression
  585.  
  586.     The body of a while statement (the part between the 'do' and the
  587.     'od') must not be an expression. This error would most likely result
  588.     from a convention change which changes a procedure which previously
  589.     did not return a value into one which does return a value.
  590.  
  591.     67 - expressions cannot be used as statements
  592.  
  593.     Unlike C, Draco will not automatically throw away the value of an
  594.     expression if that expression is used as a statement. The value must
  595.     be handled by assigning it to a variable, or by some other means.
  596.     ('pretend'ing the value to be 'void' works, but is very ugly.) This
  597.     message will appear in a position where the parser expects a semi-
  598.     colon in a statement sequence.
  599.  
  600.     68 - missing ';'
  601.  
  602.     The parser has just parsed a complete statement, and, since the
  603.     current symbol is not a statement-sequence terminator like 'fi' or
  604.     'od', a separating ';' is expected. This error often results from a
  605.     forgotten semicolon, but can also result from a preceeding syntax
  606.     error having confused the parser.
  607.  
  608.     69 - missing ','
  609.  
  610.     The comma, expected as part of a 'pretend', 'dim', 'input', etc.
  611.     construct was missing. This is normally just a typo, but can be
  612.     caused (as usual) by a preceeding syntax error.
  613.  
  614.     70 - missing ')'
  615.  
  616.     The closing parenthesis is missing from a 'pretend', 'dim', 'input',
  617.     etc. construct. A typo.
  618.  
  619.     71 - value being called is not a procedure
  620.  
  621.     In a procedure call, where the value to be called is not just a
  622.     simple procedure name, but is a more complex expression, the value
  623.     resulting is not of a procedure type. This message can be caused by
  624.     a syntax error, since any name expression, followed immediately by
  625.     an open parenthesis, is taken to be a procedure call.
  626.  
  627.     72 - too many parameters to procedure
  628.  
  629.     When calling a procedure, you have attempted to pass more parameters
  630.     then the declaration or definition of that procedure specified.
  631.  
  632.     73 - actual parameter to procedure is of wrong type
  633.  
  634.     A procedure expects two or more parameters of the same type. A
  635.     successive actual parameter was not of the required type.
  636.  
  637.     74 - actual array parameter does not match required type
  638.  
  639.     A procedure, which expects an array parameter, was called with a
  640.     parameter of the wrong type (either the array had the wrong number
  641.     of dimensions, some dimension didn't match, or the element types
  642.     differed).
  643.  
  644.     75 - array with '*' dimension cannot be passed as fixed array
  645.  
  646.     A procedure declared with an array parameter with a '*' dimension can
  647.     be passed any compatible array - that dimension can be any size. The
  648.     reverse situation does not hold. An array parameter with a '*'
  649.     dimension cannot be passed to a procedure which requires an array of
  650.     fixed size in that dimension.
  651.  
  652.     76 - not enough parameters to procedure
  653.  
  654.     The declaration or definition of the procedure being called included
  655.     more parameters than were given in this call. Parameters may not be
  656.     omitted.
  657.  
  658.     77 - missing '('
  659.  
  660.     The opening parenthesis in a 'pretend', 'dim', 'input', etc.
  661.     construct is missing. A typo.
  662.  
  663.     78 - too many values
  664.  
  665.     In an array or structure constant, the number of values required in
  666.     any give sublist is determined by the size of the array in that
  667.     dimension or by the number of fields in the structure. In this
  668.     instance, too many values were encountered. This could actually be
  669.     caused by previous syntax errors confusing the parser.
  670.  
  671.     79 - too few values
  672.  
  673.     This error is very similar to error # 78, except that it is less
  674.     likely to result from a syntax error.
  675.  
  676.     80 - cannot change the type of statements
  677.  
  678.     The 'pretend' construct cannot be used to force a type onto a
  679.     statement (which has type 'void'). To do so would not yield any
  680.     useful value.
  681.  
  682.     81 - 'dim' can only be used with arrays
  683.  
  684.     The first arguement to the 'dim' construct must be the name of an
  685.     array variable whose dimension is being retrieved.
  686.  
  687.     82 - error # 82
  688.  
  689.     This error number is not currently used.
  690.  
  691.     83 - dimension selector is 0 or too big
  692.  
  693.     The value given as a dimension selector was <= 0, or was greater than
  694.     the number of dimensions in the array.
  695.  
  696.     84 - cannot next structured constants
  697.  
  698.     Inside an array or structure constant, nested array and structure
  699.     constants are done directly - the subtype name is not given. What
  700.     appeared to be a subtype name requesting a nested structured
  701.     constant appeared. This is likely to be an accidental inclusion of
  702.     the subtype name, but could also be a syntax error.
  703.  
  704.     85 - cannot bracket a statement
  705.  
  706.     Parentheses were used to mark off an inner expression, but that
  707.     expression turned out to be a statement (or a call to a procedure
  708.     which yields 'void'). This will normally result from a change in
  709.     convention, in which a procedure which used to return a value no
  710.     longer does so.
  711.  
  712.     86 - mismatched ')'
  713.  
  714.     This message occurs when the parser finds a closing parenthesis when
  715.     it isn't expecting one. This will usually indicate a missing opening
  716.     parenthesis, or too many closing parentheses, but can also result
  717.     from a previous syntax error having confused the parser.
  718.  
  719.     87 - syntax error - undecipherable statement or expression
  720.  
  721.     This is a catch-all message given by the parser when the current
  722.     symbol is not the beginning of any construction of the language. For
  723.     example, starting a statement with '/', 'do', or ':=' will yield
  724.     this message. This usually indicates a typo, but can be caused by
  725.     a preceeding syntax error having confused the compiler.
  726.  
  727.     88 - improper use of field name
  728.  
  729.     Field names can only be used in field selection, where they follow
  730.     the '.' field selector. Any other use of a field name will cause this
  731.     message. The problem is usually a typo (misspelled name), but can
  732.     also result from the parser not recognizing a field selection
  733.     because the type of the value being selected from is wrong. A common
  734.     case of this is with dereferencing, as in 'x* .next'. If the type of
  735.     'x' isn't a pointer type, and there is a blank between the '*' and
  736.     the '.', then the '*' will be taken as a multiplication operator,
  737.     and the field selection will not be recognized.
  738.  
  739.     89 - cannot index anything except arrays
  740.  
  741.     The only use of '[' in a Draco program is in array declarations and
  742.     array indexing. In indexing, the expression to the left of the '['
  743.     must yield an array value. Any other type of value will cause this
  744.     message.
  745.  
  746.     90 - this value cannot be used as an array index
  747.  
  748.     Arrays can only be indexed by numeric and enumeration types.
  749.  
  750.     91 - value is greater than declared array dimension
  751.  
  752.     If a value indexing an array is a constant, the compiler will check
  753.     that it is appropriate for that array. If the value is negative or
  754.     greater than the size of that dimension, this message will be
  755.     produced. Note that the compiler will accept an index equal to the
  756.     size of the dimension, which is actually one too large since indexing
  757.     starts with 0. This slight fudge is done to allow the C convention
  758.     of creating a pointer to just past the last element of an array and
  759.     having some process continue until a pointer into that array hits
  760.     the limit. E.g.
  761.  
  762.         [N] int a;
  763.         *int p;
  764.  
  765.         p := &a[0];
  766.         while p ~= &a[N] do
  767.         ...
  768.         p := p + sizeof(int);
  769.         od;
  770.  
  771.     92 - not enough indexes for this array
  772.  
  773.     The closing ']' in array indexing was encountered before there had
  774.     been enough index values for the array. I.e. the declared number of
  775.     dimensions is greater than the number provided.
  776.  
  777.     93 - too many indexes for this array
  778.  
  779.     The declared dimensions in the array have run out, but more index
  780.     expressions appear to be present. I.e. the number of index
  781.     expressions provided is greater than the declared number of
  782.     dimensions in the array.
  783.  
  784.     94 - this value is not a structure - can't select from it
  785.  
  786.     The '.' field selection operator can only be applied to values which
  787.     are of structure or union types. This can be caused by a typo, or by
  788.     a syntax error which has caused the compiler to be confused about the
  789.     type of the current object.
  790.  
  791.     95 - this identifier is not a field name
  792.  
  793.     The identifier following the '.' field selection operator was not
  794.     declared as a field of a structure. This will normally result from
  795.     mistyping the identifier.
  796.  
  797.     96 - this field is not an element of this structure/union
  798.  
  799.     For a value of a given structure or union type, only the fields
  800.     declared in that type can be selected from the value. This is unlike
  801.     some versions of C, which allow any field to be selected from any
  802.     structure - a rather error-prone choice.
  803.  
  804.     97 - expecting field name
  805.  
  806.     The symbol appearing after the '.' field selection operator was not
  807.     an identifier. This can result from mistyping the field name, or
  808.     from a preceeding syntax error having confused the parser.
  809.  
  810.     98 - cannot take the address of this value
  811.  
  812.     Only objects which have an address in memory can be used as the
  813.     operand for the '&' address-of operator. E.g. an expression like
  814.     'a + b' exists only in a register, it does not have an address.
  815.  
  816.     99 - this value is not suitable for bit operations
  817.  
  818.     The bit shift operators (<< and >>) can only shift unsigned numeric
  819.     values. Signed shifts can be done using the multiplication and
  820.     division operators.
  821.  
  822.     100 - this value is not suitable for numeric operations
  823.  
  824.     The various numeric operators (unary +, -, and |; binary +, -, *, /
  825.     and %) must have numeric values as their operands (exception: one
  826.     operand of +, the left operand of -, or both operands of - can be
  827.     of pointer or enumeration types).
  828.  
  829.     101 - this value is not suitable for the '+'/'-' operations
  830.  
  831.     The operands to binary '+' must be both numeric, or one can be of a
  832.     pointer or enumeration type. The operands to binary '-' must be both
  833.     numeric, or the left-hand operand can be of a pointer or enumeration
  834.     type, or both operands can be of the same pointer or enumeration
  835.     type.
  836.  
  837.     102 - illegal combination of pointer or enumeration with number
  838.  
  839.     The operands to binary '+' must be both numeric, or one can be of a
  840.     pointer or enumeration type. The operands to binary '-' must be both
  841.     numeric, or the left-hand operand can be of a pointer or enumeration
  842.     type, or both operands can be of the same pointer or enumeration
  843.     type.
  844.  
  845.     103 - expression value cannot be made into an array or structure
  846.  
  847.     When the 'pretend' construct is being used to type-cheat, some type
  848.     changes are never meaningful. In particular, an expression, as in
  849.     'a + b' cannot possibly be used as an array or structure. It can,
  850.     however, be used as a pointer to an array or structure.
  851.  
  852.     104 - cannot compare signed v.s. unsigned except with '=' or '~='
  853.  
  854.     Signed and unsigned numeric values use the same bit pattern to
  855.     represent different values. For example, in 16 bits, the value 0xffff
  856.     is -1 if signed, but 65535 if unsigned. In comparing a signed value
  857.     to an unsigned value, what is the result? Since it is often useful
  858.     to compare such values, and since the '=' and '~=' comparisons
  859.     yield the same answers for signed and unsigned values, those
  860.     comparisons, and not any others, are allowed between a signed value
  861.     and an unsigned value. Note, however, that in 16 bit arithmetic,
  862.     the result is that -1 (a signed value) will be equal to 65535 (an
  863.     unsigned value). Similar results hold for all negative values.
  864.  
  865.     105 - attempted multiplication/division by zero
  866.  
  867.     During the compile time evaluation of an arithmetic expression, the
  868.     compiler detected an attempt to divide by zero.
  869.  
  870.     106 - 'not' can only be used with 'bool' values
  871.  
  872.     The argument to the 'not' construct must be of type 'bool'. Use the
  873.     '~' operator to complement bits in a value.
  874.  
  875.     107 - 'and' and 'or' can only be used with 'bool' values
  876.  
  877.     Both arguments to the 'and' and 'or' boolean constructs must be of
  878.     type 'bool'. Use the operators '&' and '|' to operate on the bits
  879.     of values. C programmers may run into this message by forgetting to
  880.     compare a value with 0.
  881.  
  882.     108 - cannot assign to this
  883.  
  884.     The object to the left of the ':=' construct or one of the
  885.     parameters to a 'read' or 'readln' construct, must be one which has
  886.     storage associated with it, i.e. which has an address. E.g. it is
  887.     not meaningful to say 'a + b := c'. Draco does not support nested
  888.     or multiple assignments.
  889.  
  890.     109 - 'case' selectors must be numeric or an enumeration type
  891.  
  892.     The value being used as a selector or index in a case statement or a
  893.     case expression must be of a numeric or enumeration type. It would
  894.     perhaps be marginally useful to allow other types, such as pointer
  895.     or procedure types, but Draco does not support this usage.
  896.  
  897.     110 - 'case' cannot have more than one 'default'
  898.  
  899.     Case statements and case expressions can have a 'default' case which
  900.     is selected if no other explicit selector value is matched. It is
  901.     not meaningful to have more than one default. Delete one of them.
  902.  
  903.     111 - 'case' index must be compile-time expression
  904.  
  905.     The values used to identify the various alternatives in a case
  906.     statement or a case expression must all be values which can be
  907.     computed at compile time. Some languages allow such values to be
  908.     computed at run-time, but Draco does not. The same effect can be
  909.     achieved by using an 'if' statement or expression.
  910.  
  911.     112 - 'case' indexes cannot occur more than once
  912.  
  913.     The constants used as the various alternative indexes in a case
  914.     statement or a case expression must all be unique. This will normally
  915.     be a typo in a number or a logic error when using compile-time
  916.     expressions as the 'case' indexes.
  917.  
  918.     113 - missing ':' after 'case' index
  919.  
  920.     The syntactic form of case indexes is the word 'incase', followed by
  921.     the index value, followed by a colon. That colon is missing, or the
  922.     value contained a syntax error which has confused the parser.
  923.  
  924.     114 - 'case' must have at least one alternative
  925.  
  926.     Each case statement or case expression must have at least one
  927.     alternative, otherwise they are not meaningful. This unlikely
  928.     message could occur if syntax errors have caused the parser to not
  929.     recognize all of the alternatives, or have caused it to prematurely
  930.     end the case.
  931.  
  932.     115 - missing 'esac' in 'case'
  933.  
  934.     Case statements and expressions are terminated by a closing 'esac'
  935.     ('case' spelled backwards). That 'esac' was not found when it was
  936.     expected. This can be caused by forgetting the 'esac', spelling it
  937.     wrong, or perhaps by a syntax error having confused the parser.
  938.  
  939.     116 - body of 'for' must not be an expression
  940.  
  941.     The body of a for statement (the part between the 'do' and the 'od')
  942.     must not be an expression, i.e. must not yield a value. This is most
  943.     likely caused by a change in convention in which a procedure which
  944.     did not previously yield a value now yields one.
  945.  
  946.     117 - 'for' counter must be numeric, enum or pointer variable
  947.  
  948.     The object appearing immediately after the 'for' in a for statement
  949.     is the location which is to be stepped through the sequence of
  950.     values generated in the for statement. In Draco, this object must be
  951.     a simple variable (global, file or local). Also, the type of the
  952.     variable must be a numeric type, an enumeration type or a pointer
  953.     type. This error would normally be caused by using the wrong variable
  954.     for the counter variable.
  955.  
  956.     118 - missing 'from' in 'for'
  957.  
  958.     The starting point for a for statement is specified via the word
  959.     'from' followed by an expression giving the starting point. The
  960.     word 'from' was missing. This unlikely error is probably caused by
  961.     typing the word 'from' incorrectly, or by forgetting it altogether.
  962.  
  963.     119 - missing 'upto' or 'downto' in 'for'
  964.  
  965.     The ending point for a for statement is specified via the word
  966.     'upto' or the word 'downto' followed by an expression giving the
  967.     ending point. Neither 'upto' nor 'downto' was found. This error is
  968.     typically caused by mispelling 'upto' or 'downto' (people have a
  969.     tendency to use 'to'), or by a preceeding syntax error in the 'from'
  970.     or 'by' expression.
  971.  
  972.     120 - value is not a pointer
  973.  
  974.     The '*' postfix operator (the de-referencing operator) can only be
  975.     applied to values of pointer types. The value used with this '*'
  976.     operator was not of a pointer type. This will normally result from
  977.     a bad declaration, or a typo in the expression before the '*'.
  978.  
  979.     121 - can only 'free' pointers
  980.  
  981.     The 'free' construct, which is used to release areas of storage
  982.     obtained dynamically with 'new', accepts as its singe parameter a
  983.     pointer to the region to be released. The type of the parameter must
  984.     therefore be a pointer type.
  985.  
  986.     122 - can only take 'range' of numerics and enumerations
  987.  
  988.     The 'range' construct is used to return the upper bound on a numeric
  989.     type, whether built-in or user defined, or to return the number of
  990.     elements in an enumeration type. It cannot be applied to other types.
  991.  
  992.     123 - 'by' value is out of range for loop variable
  993.  
  994.     The 'by' value in a 'for' statement is such that, with that value,
  995.     the 'for' does not make sense.
  996.  
  997.     124 - expecting 'input' or 'output' in channel type
  998.     125 - expecting 'text' or 'binary' in channel type
  999.  
  1000.     The 'channel' type specifier consists of one of the word 'channel',
  1001.     followed by one of 'input' or 'output', followed by one of 'text' or
  1002.     'binary'. Something else occurred. This is most likely a mispelling
  1003.     of one of the keywords, or an attempt to use the 'channel' keyword
  1004.     as a normal identifier.
  1005.  
  1006.     126 - first operand of 'open' must be a channel
  1007.  
  1008.     All forms of the 'open' construct require a channel expression as
  1009.     their first operand. The expression found was not of a channel type.
  1010.  
  1011.     127 - channel for standard input/output must be text channel
  1012.  
  1013.     The default (standard) input/output channels are attached to the
  1014.     system console. They must therefore be 'text' channels. Special
  1015.     control sequences, etc. can be sent using escaped characters.
  1016.  
  1017.     128 - file name for 'open' must be a chars value
  1018.  
  1019.     The form of the 'open' construct which is used to open files must
  1020.     have a chars value (expression of type *char) as its third operand.
  1021.     This operand is the name of the file to open. Remember that Draco
  1022.     does not change an array expression into a pointer to the first
  1023.     element of the array as C does.
  1024.  
  1025.     129 - wrong proc type for this channel type
  1026.  
  1027.     When opening a channel to read/write through a procedure, the type
  1028.     of the supplied procedure must be correct. For a text input
  1029.     channel, the procedure must be 'proc()char'; for a text output
  1030.     channel, the procedure must be 'proc(char ch)void'; for a binary
  1031.     input channel, the procedure must be 'proc()byte'; and for a binary
  1032.     output channel, the procedure must be 'proc(byte b)void'.
  1033.  
  1034.     130 - cannot open binary channel on a *char value
  1035.  
  1036.     The memory-to-memory formatting capabilities provided by attaching
  1037.     a channel to a memory buffer only work on text channels.
  1038.  
  1039.     131 - illegal second operand of 'open'
  1040.  
  1041.     The second operand (if any) to the 'open' construct varies,
  1042.     depending on what kind of channel is being opened. The expression
  1043.     given was not one of the allowed types. Check the description of
  1044.     Draco's I/O facilities for details.
  1045.  
  1046.     132 - operand to 'close'/'ioerror' must be a channel
  1047.  
  1048.     The operand (if any) to the 'close' and 'ioerror' constructs must
  1049.     be an expression yielding a channel to close or check.
  1050.  
  1051.     133 - special first operand of 'read'/'write' must be a channel
  1052.  
  1053.     When reading from or writing to anything other than the terminal, a
  1054.     channel expression is supplied to the 'read' and 'write'
  1055.     constructs. This special first operand is recognized by being
  1056.     followed by a semicolon instead of the usual comma. The semicolon is
  1057.     required even if nothing is being read/written (e.g. when doing a
  1058.     'readln'/'writeln'). An expression followed by a semicolon was
  1059.     found, but the expression was not of a channel type.
  1060.  
  1061.     134 - invalid operation for a channel of this type
  1062.  
  1063.     Certain of the I/O operations can only be performed on channels of
  1064.     the appropriate type. For example, you can't read on an output
  1065.     channel and vice versa. Other cases are trying to 'readln'/'writeln'
  1066.     on a binary channel, or trying to use a format code on a binary
  1067.     channel.
  1068.  
  1069.     135 - format codes can only be used with numeric values
  1070.  
  1071.     Format and size specifiers, given after colons after the expression
  1072.     to be output in a 'write' or 'writeln', can only be used with
  1073.     numeric expressions.
  1074.  
  1075.     136 - invalid format code
  1076.  
  1077.     The only format codes recognized in 'write'/'writeln' statements
  1078.     are as follows:
  1079.  
  1080.         i - signed decimal
  1081.         u - unsigned decimal
  1082.         x - hexadecimal
  1083.         o - octal
  1084.         b - binary
  1085.  
  1086.     137 - field width must be numeric value
  1087.  
  1088.     The field width given on a 'write'/'writeln' for formatted output
  1089.     of numeric values must be a numeric expression.
  1090.  
  1091.     138 - invalid type for text I/O
  1092.  
  1093.     In binary I/O, all values can be read/written since the operation
  1094.     simply involves the passing of byte streams. For text I/O, however,
  1095.     only types which have a language known textual representation can
  1096.     be read/written. This includes character, chars and numeric values.
  1097.  
  1098.     139 - input/output constructs not supported by this version
  1099.  
  1100.     This error occurs only when trying to use one of the I/O constructs
  1101.     with a version of the compiler which has them conditioned out. They
  1102.     are conditioned out to save compiler code space for use on a
  1103.     smaller memory system.
  1104.  
  1105.     140 - this type has no constants
  1106.  
  1107.     A type or subtype encountered when parsing a structured (array or
  1108.     structure) constant is one which doesn't have a textual
  1109.     representation. For example, procedure types cannot currently be
  1110.     used in such constants.
  1111.  
  1112.     141 - type is not an array or structure
  1113.  
  1114.     Structured constants in line, which consist of the name of the type
  1115.     followed by a parenthesized list of values, can only be used with
  1116.     array and structure constants. Other types, such as simple numeric
  1117.     types, have constant forms of their own.
  1118.  
  1119.     142 - missing external name in operator type
  1120.  
  1121.     An operator type construct appears to be missing the string
  1122.     constant specifying the external name the compiler is to prefix the
  1123.     function names with. This string constant appears after the opening
  1124.     parenthesis of an operator type. Note that types in Draco have no
  1125.     syntactic ambiguities such as C types have, so parenthesization is
  1126.     neither needed nor supported.
  1127.  
  1128.     143 - operation not supported by this operator type
  1129.  
  1130.     The operation requested on a value of an operator type is one which
  1131.     the operator type specification did not enable. This could result
  1132.     from a variety of causes, such as a bad declaration, or a very
  1133.     confusing syntax error.
  1134.  
  1135.     144 - operator types cannot be mixed with other types
  1136.  
  1137.     Values of operator types can only participate in expressions with
  1138.     values of that same operator type. The compiler has no way to do
  1139.     conversions, and it was felt inappropriate to either require the
  1140.     type implementor to supply a whole range of conversion routines, or
  1141.     to have the error not detected until link time (by not finding the
  1142.     special-named conversion routine).
  1143.  
  1144.     145 - can only compare with '=' or '~=' for this type
  1145.  
  1146.     The compiler currently allows array and structure types to be
  1147.     compared using '=' and '~='. This is OK on the 8080 version where
  1148.     there will be no padding in structures, but is in general not very
  1149.     meaningful, so will be removed from later versions of the compiler.
  1150.     This error message results from trying to use an order comparison
  1151.     with such a type (or an operator type for which OPCPR was not
  1152.     specified).
  1153.  
  1154.     146 - 'error' must have string argument
  1155.  
  1156.     The 'error' construct, which takes a string constant and prints it
  1157.     as an error message at compile time, was given an argument which
  1158.     did not have type *char.
  1159.